<#include "/@inc/IDLImplFuncMacros.ftl">
<#assign className = TriaGram + "EA" + Prefix + LateType>
<#assign baseName = TriaGram + Prefix + LateType>
<#assign IDLName = TriaGram + "IA" + Prefix + LateType>
<@pp.renameOutputFile name=className+".h">
</@pp.renameOutputFile>
<#include "/@inc/copyright.txt">
//===================================================================
//
// ${className}.h
// Provide implementation to interface ${IDLName}
//
//===================================================================
#ifndef ${className}_H
#define ${className}_H

// System framework
#include "CATBaseUnknown.h"        // needed as base implementation class
#include "CATBSTR.h"               // needed to use OLE strings
class     CATBaseDispatch;         // needed as operating system independant IDispatch interface

// InfInterfaces framework
#include "CATIAApplication.h"      // needed as root interface for CATIA object
class CATIAReference;              // needed as a specification handle to OLE objects

// MecModInterfaces framework
#include "CATIAHybridShape.h"      // needed to localize the vertical line in the CATIA exposed model

// SketcherInterfaces framework
#include "CATGeometricType.h"      // needed to identify the vertical line among other geometric objects 

//-----------------------------------------------------------------------
// Class extending the Vertical Line sample feature - NEOPixLine
// in order to implement attribute access methods
//-----------------------------------------------------------------------
class  ${className}: public CATBaseUnknown
{
  CATDeclareClass;

  public:

    // Standard constructors and destructors
    ${className} ();
    virtual ~${className} ();

    // Returns CATIA as an application
    HRESULT  get_Application(CATIAApplication *& opiApplicationOnCATIA);
    // Returns the parent class as regards the exposed modelization
    HRESULT __stdcall get_Parent(CATBaseDispatch *& opiBaseOnOLEParent);

    // Returns the entity name
    HRESULT           get_Name(CATBSTR         & oName);
    // Sets the entity name
    HRESULT           put_Name(const CATBSTR   & iName);

    // Gives an child exposed object when this object is considered as a container
    HRESULT GetItem(const CATBSTR & iName, CATBaseDispatch *& opiBaseOnChildObject);


    // CATIAGeometricalElement Interface method

    // Returns the type of the underlying geometrical element
	HRESULT __stdcall get_GeometricType(CatGeometricType & oType);

    // CATIAHybridShape interface methods

    // Builds the feature geometrical result according to its specifications
    HRESULT __stdcall Compute();

    // Appends a hybrid shape to another hybrid shape
	HRESULT __stdcall AppendHybridShape (CATIAHybridShape *ipiHybridShapeOnShape);

    HRESULT __stdcall get_Thickness(CATIAHybridShape * oThickness);


   // ${IDLName} interface methods

  <#list Attributes as attrib>
  <#if attrib.type?starts_with("tklist") >
   <@IDL_IMP_LIST_FUNC_DECL attr=attrib />
  <#else>
    <@IDL_IMP_FUNC_DECL attr=attrib />
  </#if>
  </#list>
	
  private:
  
  <#list Attributes as attr>
<#list Types as x>
<#if x.tk_type == attr.type>
	${x.type}  _${x.prefix?uncap_first}${attr.name} ;
</#if>
</#list>
</#list>
  
  // In order to avoid public implementation by compilers
  ${className} (${className} &);
  ${className}& operator=(${className}&);

};

//-----------------------------------------------------------------------

#endif
